/* eslint-disable radix */

// 5. `is`：检查值是否为特定类型。
// eslint-disable-next-line no-sparse-arrays
export const is = (type, val) =>
  ![, null].includes(val) && val.constructor === type;
// is(Array, [1]); // true
// is(ArrayBuffer, new ArrayBuffer()); // true
// is(Map, new Map()); // true
// is(RegExp, /./g); // true
// is(Set, new Set()); // true
// is(WeakMap, new WeakMap()); // true
// is(WeakSet, new WeakSet()); // true
// is(String, ''); // true

// 判断数据的类型和格式验证
export function isString(o) {
  // 是否字符串
  return Object.prototype.toString.call(o).slice(8, -1) === "String";
}

export function isNumber(o) {
  // 是否数字
  return Object.prototype.toString.call(o).slice(8, -1) === "Number";
}

export function isBoolean(o) {
  // 是否boolean
  return Object.prototype.toString.call(o).slice(8, -1) === "Boolean";
}

export function isFunction(o) {
  // 是否函数
  return Object.prototype.toString.call(o).slice(8, -1) === "Function";
}

export function isNull(o) {
  // 是否为null
  return Object.prototype.toString.call(o).slice(8, -1) === "Null";
}

export function isUndefined(o) {
  // 是否undefined
  return Object.prototype.toString.call(o).slice(8, -1) === "Undefined";
}

export function isObj(o) {
  // 是否对象
  return Object.prototype.toString.call(o).slice(8, -1) === "Object";
}

export function isArray(o) {
  // 是否数组
  return Object.prototype.toString.call(o).slice(8, -1) === "Array";
}

export function isDate(o) {
  // 是否时间
  return Object.prototype.toString.call(o).slice(8, -1) === "Date";
}

export function isRegExp(o) {
  // 是否正则
  return Object.prototype.toString.call(o).slice(8, -1) === "RegExp";
}

export function isError(o) {
  // 是否错误对象
  return Object.prototype.toString.call(o).slice(8, -1) === "Error";
}

export function isSymbol(o) {
  // 是否Symbol函数
  return Object.prototype.toString.call(o).slice(8, -1) === "Symbol";
}

export function isPromise(o) {
  // 是否Promise对象
  return Object.prototype.toString.call(o).slice(8, -1) === "Promise";
}

export function isSet(o) {
  // 是否Set对象
  return Object.prototype.toString.call(o).slice(8, -1) === "Set";
}

export function isFalse(o) {
  if (
    o === "" ||
    o === undefined ||
    o === null ||
    o === "null" ||
    o === "undefined" ||
    o === 0 ||
    o === false ||
    isNaN(0)
  )
    return true;
  return false;
}

export function isTrue(o) {
  return !this.isFalse(o);
}

export function isIos() {
  const u = navigator.userAgent;
  if (u.indexOf("Android") > -1 || u.indexOf("Linux") > -1) {
    // 安卓手机
    // return "Android";
    return false;
  }
  if (u.indexOf("iPhone") > -1) {
    // 苹果手机
    // return "iPhone";
    return true;
  }
  if (u.indexOf("iPad") > -1) {
    // iPad
    // return "iPad";
    return false;
  }
  if (u.indexOf("Windows Phone") > -1) {
    // winphone手机
    // return "Windows Phone";
    return false;
  }
  return false;
}

export function isPC() {
  // 是否为PC端
  const userAgentInfo = navigator.userAgent;
  const Agents = [
    "Android",
    "iPhone",
    "SymbianOS",
    "Windows Phone",
    "iPad",
    "iPod"
  ];
  let flag = true;
  for (let v = 0; v < Agents.length; v++) {
    if (userAgentInfo.indexOf(Agents[v]) > 0) {
      flag = false;
      break;
    }
  }
  return flag;
}

export function browserType() {
  const { userAgent } = navigator; // 取得浏览器的userAgent字符串
  const isOpera = userAgent.indexOf("Opera") > -1; // 判断是否Opera浏览器
  const isIE =
    userAgent.indexOf("compatible") > -1 &&
    userAgent.indexOf("MSIE") > -1 &&
    !isOpera; // 判断是否IE浏览器
  const isIE11 =
    userAgent.indexOf("Trident") > -1 && userAgent.indexOf("rv:11.0") > -1;
  const isEdge = userAgent.indexOf("Edge") > -1 && !isIE; // 判断是否IE的Edge浏览器
  const isFF = userAgent.indexOf("Firefox") > -1; // 判断是否Firefox浏览器
  const isSafari =
    userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") === -1; // 判断是否Safari浏览器
  const isChrome =
    userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1; // 判断Chrome浏览器

  if (isIE) {
    const reIE = new RegExp("MSIE (\\d+\\.\\d+);");
    reIE.test(userAgent);
    const fIEVersion = parseFloat(RegExp.$1);
    if (fIEVersion === 7) return "IE7";
    if (fIEVersion === 8) return "IE8";
    if (fIEVersion === 9) return "IE9";
    if (fIEVersion === 10) return "IE10";
    return "IE7以下"; // IE版本过低
  }
  if (isIE11) return "IE11";
  if (isEdge) return "Edge";
  if (isFF) return "FF";
  if (isOpera) return "Opera";
  if (isSafari) return "Safari";
  if (isChrome) return "Chrome";
}
/*
  检测密码强度
*/
export function checkPwd(str) {
  let Lv = 0;
  if (str.length < 6) {
    return Lv;
  }
  if (/[0-9]/.test(str)) {
    Lv++;
  }
  if (/[a-z]/.test(str)) {
    Lv++;
  }
  if (/[A-Z]/.test(str)) {
    Lv++;
  }
  if (/[\.|-|_]/.test(str)) {
    Lv++;
  }
  return Lv;
}
//

// 检查格式
export function checkStr(str, type) {
  str = str + "";
  switch (type) {
    case "positiveInteger": // 正整数
      return /^(0|[1-9][0-9]*)$/.test(str);
    case "positive": // 正数
      return /^(0|[1-9][0-9]*)(\.\d+)?$/.test(str);
    case "phone": // 手机号码
      return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
    case "tel": // 座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
    case "card": // 身份证
      return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
    case "pwd":
      // 密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
      // return /^[a-zA-Z]\w{5,17}$/.test(str)
      // 字母或数字 8-12位
      return /^[a-zA-Z0-9]{8,12}$/.test(str);
    case "postal": // 邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str);
    case "QQ": // QQ号
      return /^[1-9][0-9]{4,9}$/.test(str);
    case "email": // 邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
    case "money": // 金额(小数点2位)
      return /^(([1-9]\d*)|0)(?:\.\d{1,2})?$/.test(str);
    case "URL": // 网址
      return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(
        str
      );
    case "date": // 日期时间
      return (
        /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(
          str
        ) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
      );
    case "number": // 数字
      return /^[0-9]$/.test(str);
    case "english": // 英文
      return /^[a-zA-Z]+$/.test(str);
    case "chinese": // 中文
      return /^[\u4E00-\u9FA5]+$/.test(str);
    case "lower": // 小写
      return /^[a-z]+$/.test(str);
    case "upper": // 大写
      return /^[A-Z]+$/.test(str);
    default:
      return true;
  }
}

// 严格的身份证校验
export function isCardID(sId) {
  if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {
    // alert("你输入的身份证长度或格式错误");
    return false;
  }
  // 身份证城市
  const aCity = {
    11: "北京",
    12: "天津",
    13: "河北",
    14: "山西",
    15: "内蒙古",
    21: "辽宁",
    22: "吉林",
    23: "黑龙江",
    31: "上海",
    32: "江苏",
    33: "浙江",
    34: "安徽",
    35: "福建",
    36: "江西",
    37: "山东",
    41: "河南",
    42: "湖北",
    43: "湖南",
    44: "广东",
    45: "广西",
    46: "海南",
    50: "重庆",
    51: "四川",
    52: "贵州",
    53: "云南",
    54: "西藏",
    61: "陕西",
    62: "甘肃",
    63: "青海",
    64: "宁夏",
    65: "新疆",
    71: "台湾",
    81: "香港",
    82: "澳门",
    91: "国外"
  };
  if (!aCity[parseInt(sId.substr(0, 2))]) {
    // alert("你的身份证地区非法");
    return false;
  }

  // 出生日期验证
  const sBirthday = (
    sId.substr(6, 4) +
    "-" +
    Number(sId.substr(10, 2)) +
    "-" +
    Number(sId.substr(12, 2))
  ).replace(/-/g, "/");
  const d = new Date(sBirthday);
  if (
    sBirthday !==
    d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate()
  ) {
    // alert("身份证上的出生日期非法");
    return false;
  }

  // 身份证号码校验
  let sum = 0;
  const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  const codes = "10X98765432";
  for (let i = 0; i < sId.length - 1; i++) {
    sum += sId[i] * weights[i];
  }
  const last = codes[sum % 11]; // 计算出来的最后一位身份证号码
  if (sId[sId.length - 1] !== last) {
    // alert("你输入的身份证号非法");
    return false;
  }

  return true;
}
